﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Transactions;

namespace BLL
{
	public class QLThietBi
	{

		public static IEnumerable<ThietBi> GetAll()
		{
			return Generic.GetAll<ThietBi>();
		}

        public static IEnumerable<MayTinh> GetAllMT()
        {
            return Generic.GetAll<MayTinh>();
        }
        public static ValidationResult Validate(ThietBi tb)
        {
            try
            {
                ValidationResult kq = new ValidationResult();
                if (tb.LoaiTB == "")
                {
                    kq.Messages.Add("loại thiết bị phải khác rỗng !");
                }
                if (tb.MaTB == "")
                {
                    kq.Messages.Add("mã thiết bị phải khác rỗng !");
                }
                if (tb.NgayNhap == null)
                {
                    kq.Messages.Add(" ngày nhập thiết bị không được để trống!");
                }
                if (FindByCondition(x => x.MaTB == tb.MaTB).Count() > 0)
                {
                    kq.Messages.Add("mã thiết bị đã tồn tại");
                }
                return kq;
            }
            catch(Exception e)
            {
                return null;
            }
        }
		public static ActionResult InsertTB(ThietBi tb)
		{
            ActionResult act = new ActionResult("Thêm thiết bị");
            var kiemtratb = Validate(tb);
            if (kiemtratb.Valid)
            {
                try
                {
                    if (!Generic.Insert<ThietBi>(tb))
                    {
                        act.Exceptions.Add(new Exception("lỗi"));
                    }

                }
                catch (Exception ex)
                {
                    act.Exceptions.Add(ex);
                }
            }
            kiemtratb.Messages.ForEach(x=>act.Exceptions.Add(new Exception(x)));
            return act;
		}
      

		public static int DeleteByMaTB(string matb)
		{
			return Generic.DeleteByCondition<ThietBi>(tb1 => tb1.MaTB == matb);
		}
		public static int Delete(ThietBi tb)
		{
			return Generic.DeleteByCondition<ThietBi>(tb1 => tb1.MaTB == tb.MaTB);
		}
		public static int DeleteAll(IEnumerable<ThietBi> ps)
		{
			return Generic.DeleteByCondition<ThietBi>(tb => ps.Where(x => x.MaTB == tb.MaTB).Count() == 1);
		}
        public static ActionResult Update(ThietBi tb)
        {
            ActionResult kq = new ActionResult("cập nhật thiết bi");
            if (tb.LoaiTB == "")
            {
                kq.Exceptions.Add(new Exception("loại thiết bị phải khác rỗng !"));
            }
            if (tb.MaTB == "")
            {
                kq.Exceptions.Add(new Exception("mã thiết bị phải khác rỗng !"));
            }
            if (tb.NgayNhap == null)
            {
                kq.Exceptions.Add(new Exception(" ngày nhập thiết bị không được để trống!"));
            }
            if (kq.Success)
            {
                try
                {
                    Generic.EditByCondition<ThietBi>(k => k.MaTB == tb.MaTB, k =>
                    {
                        k.MaTB = tb.MaTB;
                        k.NgayLapRap = tb.NgayLapRap;
                        k.NgayNhap = tb.NgayNhap;
                        k.NhanHieu = tb.NhanHieu;
                        k.LoaiTB = tb.LoaiTB;
                        k.TinhTrang = tb.TinhTrang;
                        k.XuatXu = tb.XuatXu;
                    });
                }
                catch (Exception ex)
                {
                    kq.Exceptions.Add(ex);
                }
            }
            return kq;
        }
        /// <summary>
        /// Find 1 thiết bị theo mã thiết bị
        /// </summary>
        public static ThietBi FindByID(string matb)
        {
            return Generic.FindOneByCondition<ThietBi>(x=>x.MaTB==matb);
        }

		/// <summary>
		/// Find ds thiết bị theo Điều Kiện.
		/// </summary>
		public static IEnumerable<ThietBi> FindByCondition(Func<ThietBi, bool> func)
		{
			return Generic.FindByCondition<ThietBi>(func);
		}
		/// <summary>
		/// Find Thông tin thiết bị theo mã tb.
		/// </summary>
		public static ThietBi FindThongTin(string MaTB)
		{
			IEnumerable<ThietBi> tt = Generic.FindByCondition<ThietBi>(x => x.MaTB == MaTB);
			return tt.Count() == 0 ? null : tt.First();
		}
		public static IEnumerable<ThietBi> FindThongTin(Func<ThietBi, bool> func)
		{
			IEnumerable<ThietBi> tt = Generic.FindByCondition<ThietBi>(x => func(x) == true);
			return tt;
		}
        #region Tìm Kiếm
        /// <summary>
		/// Tim Kiếm Theo Dieu Kien
		/// </summary>
		public enum DKTimKiem
		{
			MaTB = 0,
			LoaiTB,
			NhanHieu,
			XuatXu,
			NgayNhap,
			NgayLapRap,
			TinhTrang
		};
		public static void TimKiem(DataGridView dtgvQLTB, DKTimKiem dk, string dktimkiem)
		{
			try
			{
				switch (dk)
				{
					case DKTimKiem.MaTB:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.MaTB.ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.LoaiTB:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.LoaiTB.ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.NhanHieu:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.NhanHieu.ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.XuatXu:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.XuatXu.ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.NgayNhap:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.NgayNhap.ToShortDateString().ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.NgayLapRap:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x =>x.NgayLapRap!=null&& Regex.IsMatch(x.NgayLapRap.Value.ToShortDateString().ToLower(), dktimkiem.ToLower()));
						break;
					case DKTimKiem.TinhTrang:
						dtgvQLTB.DataSource = QLThietBi.FindByCondition(x => Regex.IsMatch(x.TinhTrang.ToLower(), dktimkiem.ToLower()));
						break;
					default:
						break;
				}
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}
		}
        #endregion
        #region Xắp Xếp
        static int click = 0;

        public static void XapXep(DataGridView drThietBi ,DataGridViewCellEventArgs e)
        {
            IEnumerable<ThietBi> tb = null;
            if (drThietBi.Columns[e.ColumnIndex].Name == "MaThietBi")
            {
                click++;
                
                if (click == 1)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.MaTB
                         select thietbi;
                }
                else if (click == 2)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.MaTB descending
                         select thietbi;
                    click = 0;
                }

                drThietBi.DataSource = tb.ToList();
            }
            else if (drThietBi.Columns[e.ColumnIndex].Name == "NgayNhap")
            {
                click++;
                if (click == 1)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.NgayNhap
                         select thietbi;
                }
                else if (click == 2)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.NgayNhap descending
                         select thietbi;
                    click = 0;
                }

                drThietBi.DataSource = tb.ToList();
            }
            else if (drThietBi.Columns[e.ColumnIndex].Name == "NgayLapRap")
            {
                click++;
                if (click == 1)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.NgayLapRap
                         select thietbi;
                }
                else if (click == 2)
                {
                    tb = from thietbi in QLThietBi.GetAll().ToList()
                         orderby thietbi.NgayLapRap descending
                         select thietbi;
                    click = 0;
                }

                drThietBi.DataSource = tb.ToList();
            }
        }
        #endregion
    }
}
